/*
 * @(#)XfspRulebaseTabularDirector.java        2004/08/01
 *
 * This file is part of Xfuzzy 3.1, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfsp.model.rulebases;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import xfuzzy.lang.Conclusion;
import xfuzzy.lang.KnowledgeBase;

/**
 * <p> <b>Descripci�n:</b> dirige la construcci�n de una nueva base de reglas a
 * partir de un cubrimiento m�nimo de los mint�rminos de una base de reglas.
 * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
 * @author Jorge Agudo Praena
 * @version 1.1
 * @see XfspModel
 * @see XfspTabularSimplifier
 * @see XfspRulebaseTabularBuilder
 *
 */
public class XfspRulebaseTabularDirector {

  //constructor de reglas a partir de los mint�rminos asociados a una
  //determinada conclusi�n
  private XfspRulebaseTabularBuilder builder;

  //indica si se deben mantener las funciones de pertenencia situadas en los
  //extremos del universo de discurso de cada tipo
  private boolean maintainExtremeMF;

  /**
   * <p> <b>Descripci�n:</b> crea un constructor de bases de reglas a partir de
   * un cubrimiento m�nimo de los mint�rminos de una base de reglas que se
   * quiere simplificar.
   *
   */
  public XfspRulebaseTabularDirector() {
  }

  /**
   * <p> <b>Descripci�n:</b> establece si se deben mantener las funciones de
   * pertenencia situadas en los extremos del universo de discurso de cada tipo.
   * @param maintainExtremeMF Si vale cierto se mantienen las funciones de
   * pertenencia situadas en los extremos del universo de discurso de cada tipo
   * y si vale falso no lo hace.
   *
   */
  public void setMaintainExtremeMF(boolean maintainExtremeMF){
    //indica si se deben mantener las funciones de pertenencia que est�n en los
    //extremos del universo de discurso de las variables o, por el contrario, si
    //pueden ser eliminadas
    this.maintainExtremeMF = maintainExtremeMF;
  }

  /**
   * <p> <b>Descripci�n:</b> construye una base de reglas a partir de una base
   * de reglas original y del cubrimiento m�nimo de los mint�rminos asociados a
   * dicha base de reglas.
   * @param minimalCovering Cubrimiento m�nimo de los mint�rminos asociados a
   * la base de reglas original.
   * @param rulebase Base de reglas para la que se quiere construir otra
   * equivalente a partir del cubrimiento m�nimo de sus mint�rminos.
   *
   */
  @SuppressWarnings("rawtypes")
public KnowledgeBase build(Map minimalCovering, KnowledgeBase rulebase) {
    //crea el constructor de reglas para los mint�rminos asociados a una
    //determinada conclusi�n
    builder = new XfspRulebaseTabularBuilder(this.maintainExtremeMF,rulebase);
    //iterador que permite recorrer los mint�rminos que forman el cubrimiento
    //m�nimo asociado a una conclusi�n
    Iterator it = minimalCovering.keySet().iterator();
    //para los mint�rminos de todas las conclusiones de la base de reglas
    //original...
    while (it.hasNext()) {
      //...obtiene una nueva conclusi�n...
      Conclusion conc = (Conclusion) it.next();
      //...los mint�rminos que forman su  cubrimiento m�nimo...
      Set minterms = (Set) minimalCovering.get(conc);
      //...y construye un conjunto de reglas para dicha conclusi�n a partir de
      //los mint�rminos anteriores
      builder.buildRule(conc, minterms);
    }
    //devuelve la base de reglas que se ha construido tras tratar todas las
    //conclusiones de la base de reglas original
    return builder.getRulebase();
  }
}
